package com.example.foo.ftt.service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.core.PageResult;
import com.example.core.Pageable;
import com.example.foo.ftt.model.FttUserProfit;
import com.example.foo.ftt.query.FttUserProfitQuery;
import com.example.foo.ftt.FttLevel;
import com.example.foo.ftt.FttUserProfitException;
import com.example.foo.ftt.dao.FttUserProfitDao;

@org.springframework.stereotype.Service
public class FttUserProfitService {

	private final FttUserProfitDao fttUserProfitDao;

	public FttUserProfitService(FttUserProfitDao fttUserProfitDao) {
		this.fttUserProfitDao = fttUserProfitDao;
	}

	// ========== FttUserProfit ==========

	public PageResult<FttUserProfit> findFttUserProfits(FttUserProfitQuery fttUserProfitQuery, Pageable pageable) {
		return fttUserProfitDao.findFttUserProfits(fttUserProfitQuery, pageable);
	}

	public List<FttUserProfit> findFttUserProfitsByIds(List<Long> ids) {
		return fttUserProfitDao.selectBatchIds(ids);
	}

	public FttUserProfit findFttUserProfitById(Long id) {
		return fttUserProfitDao.selectById(id);
	}

	public boolean findFttUserProfitCountExistByPeriodDayAndUserId(Integer periodDay, Long userId) {
		return fttUserProfitDao.selectCount(new QueryWrapper<FttUserProfit>()
				.eq("period_day", periodDay)
				.eq("user_id", userId)
				) > 0;
	}

	public void createFttUserProfit(FttLevel fttLevel, BigDecimal money, Integer periodDay, Long userId, String cellphone) {
		if (findFttUserProfitCountExistByPeriodDayAndUserId(periodDay, userId)) {
			throw new FttUserProfitException(String.format("FttUserProfit duplicated periodDay=%s, userId=%s", periodDay, userId));
		}

		FttUserProfit fttUserProfit = new FttUserProfit();
		fttUserProfit.setFttLevel(fttLevel);
		fttUserProfit.setMoney(money);
		fttUserProfit.setPeriodDay(periodDay);
		fttUserProfit.setUserId(userId);
		fttUserProfit.setCellphone(cellphone);
		fttUserProfit.setCreatedAt(LocalDateTime.now());
		fttUserProfitDao.insert(fttUserProfit);
	}

}
